/*
 * $Id: Mathlib.cpp 780 2009-02-13 14:01:03Z nicolas $
 *
 *  Created on: 29 janv. 2009
 *      Author: nicolas.bredeche(at)lri.fr
 */

#include "lioutils/lio_global.h"

#include "lioutils/Mathlib.h"

#include "math.h"

#include <boost/random/linear_congruential.hpp>
#include <boost/random/uniform_01.hpp>
#include <boost/random/uniform_real.hpp>
#include <boost/random/variate_generator.hpp>

const int Mathlib::_tanhArraySize = 256;
const LIOReal Mathlib::_tanhArray[Mathlib::_tanhArraySize] = { (LIOReal)-0.99999977 , (LIOReal)-0.99999974 , (LIOReal)-0.99999971 , (LIOReal)-0.99999967 , (LIOReal)-0.99999963 , (LIOReal)-0.99999958 , (LIOReal)-0.99999952 , (LIOReal)-0.99999946 , (LIOReal)-0.99999939 , (LIOReal)-0.99999930 , (LIOReal)-0.99999921 , (LIOReal)-0.99999911 , (LIOReal)-0.99999899 , (LIOReal)-0.99999885 , (LIOReal)-0.99999870 , (LIOReal)-0.99999852 , (LIOReal)-0.99999832 , (LIOReal)-0.99999810 , (LIOReal)-0.99999785 , (LIOReal)-0.99999756 , (LIOReal)-0.99999723 , (LIOReal)-0.99999686 , (LIOReal)-0.99999644 , (LIOReal)-0.99999597 , (LIOReal)-0.99999543 , (LIOReal)-0.99999481 , (LIOReal)-0.99999412 , (LIOReal)-0.99999333 , (LIOReal)-0.99999244 , (LIOReal)-0.99999143 , (LIOReal)-0.99999029 , (LIOReal)-0.99998899 , (LIOReal)-0.99998752 , (LIOReal)-0.99998585 , (LIOReal)-0.99998396 , (LIOReal)-0.99998181 , (LIOReal)-0.99997938 , (LIOReal)-0.99997662 , (LIOReal)-0.99997350 , (LIOReal)-0.99996995 , (LIOReal)-0.99996594 , (LIOReal)-0.99996138 , (LIOReal)-0.99995622 , (LIOReal)-0.99995036 , (LIOReal)-0.99994373 , (LIOReal)-0.99993620 , (LIOReal)-0.99992767 , (LIOReal)-0.99991801 , (LIOReal)-0.99990704 , (LIOReal)-0.99989461 , (LIOReal)-0.99988052 , (LIOReal)-0.99986455 , (LIOReal)-0.99984644 , (LIOReal)-0.99982591 , (LIOReal)-0.99980264 , (LIOReal)-0.99977626 , (LIOReal)-0.99974634 , (LIOReal)-0.99971243 , (LIOReal)-0.99967399 , (LIOReal)-0.99963041 , (LIOReal)-0.99958100 , (LIOReal)-0.99952500 , (LIOReal)-0.99946150 , (LIOReal)-0.99938953 , (LIOReal)-0.99930793 , (LIOReal)-0.99921544 , (LIOReal)-0.99911058 , (LIOReal)-0.99899172 , (LIOReal)-0.99885699 , (LIOReal)-0.99870427 , (LIOReal)-0.99853115 , (LIOReal)-0.99833492 , (LIOReal)-0.99811250 , (LIOReal)-0.99786041 , (LIOReal)-0.99757468 , (LIOReal)-0.99725085 , (LIOReal)-0.99688385 , (LIOReal)-0.99646794 , (LIOReal)-0.99599664 , (LIOReal)-0.99546259 , (LIOReal)-0.99485748 , (LIOReal)-0.99417191 , (LIOReal)-0.99339524 , (LIOReal)-0.99251546 , (LIOReal)-0.99151899 , (LIOReal)-0.99039049 , (LIOReal)-0.98911266 , (LIOReal)-0.98766595 , (LIOReal)-0.98602836 , (LIOReal)-0.98417508 , (LIOReal)-0.98207818 , (LIOReal)-0.97970628 , (LIOReal)-0.97702410 , (LIOReal)-0.97399207 , (LIOReal)-0.97056588 , (LIOReal)-0.96669596 , (LIOReal)-0.96232695 , (LIOReal)-0.95739720 , (LIOReal)-0.95183820 , (LIOReal)-0.94557401 , (LIOReal)-0.93852073 , (LIOReal)-0.93058599 , (LIOReal)-0.92166855 , (LIOReal)-0.91165794 , (LIOReal)-0.90043426 , (LIOReal)-0.88786829 , (LIOReal)-0.87382169 , (LIOReal)-0.85814770 , (LIOReal)-0.84069220 , (LIOReal)-0.82129532 , (LIOReal)-0.79979360 , (LIOReal)-0.77602295 , (LIOReal)-0.74982230 , (LIOReal)-0.72103813 , (LIOReal)-0.68952981 , (LIOReal)-0.65517571 , (LIOReal)-0.61788001 , (LIOReal)-0.57757994 , (LIOReal)-0.53425319 , (LIOReal)-0.48792498 , (LIOReal)-0.43867448 , (LIOReal)-0.38663978 , (LIOReal)-0.33202109 , (LIOReal)-0.27508138 , (LIOReal)-0.21614426 , (LIOReal)-0.15558870 , (LIOReal)-0.09384073 , (LIOReal)-0.03136226 , (LIOReal)0.03136226 , (LIOReal)0.09384073 , (LIOReal)0.15558870 , (LIOReal)0.21614426 , (LIOReal)0.27508138 , (LIOReal)0.33202109 , (LIOReal)0.38663978 , (LIOReal)0.43867448 , (LIOReal)0.48792498 , (LIOReal)0.53425319 , (LIOReal)0.57757994 , (LIOReal)0.61788001 , (LIOReal)0.65517571 , (LIOReal)0.68952981 , (LIOReal)0.72103813 , (LIOReal)0.74982230 , (LIOReal)0.77602295 , (LIOReal)0.79979360 , (LIOReal)0.82129532 , (LIOReal)0.84069220 , (LIOReal)0.85814770 , (LIOReal)0.87382169 , (LIOReal)0.88786829 , (LIOReal)0.90043426 , (LIOReal)0.91165794 , (LIOReal)0.92166855 , (LIOReal)0.93058599 , (LIOReal)0.93852073 , (LIOReal)0.94557401 , (LIOReal)0.95183820 , (LIOReal)0.95739720 , (LIOReal)0.96232695 , (LIOReal)0.96669596 , (LIOReal)0.97056588 , (LIOReal)0.97399207 , (LIOReal)0.97702410 , (LIOReal)0.97970628 , (LIOReal)0.98207818 , (LIOReal)0.98417508 , (LIOReal)0.98602836 , (LIOReal)0.98766595 , (LIOReal)0.98911266 , (LIOReal)0.99039049 , (LIOReal)0.99151899 , (LIOReal)0.99251546 , (LIOReal)0.99339524 , (LIOReal)0.99417191 , (LIOReal)0.99485748 , (LIOReal)0.99546259 , (LIOReal)0.99599664 , (LIOReal)0.99646794 , (LIOReal)0.99688385 , (LIOReal)0.99725085 , (LIOReal)0.99757468 , (LIOReal)0.99786041 , (LIOReal)0.99811250 , (LIOReal)0.99833492 , (LIOReal)0.99853115 , (LIOReal)0.99870427 , (LIOReal)0.99885699 , (LIOReal)0.99899172 , (LIOReal)0.99911058 , (LIOReal)0.99921544 , (LIOReal)0.99930793 , (LIOReal)0.99938953 , (LIOReal)0.99946150 , (LIOReal)0.99952500 , (LIOReal)0.99958100 , (LIOReal)0.99963041 , (LIOReal)0.99967399 , (LIOReal)0.99971243 , (LIOReal)0.99974634 , (LIOReal)0.99977626 , (LIOReal)0.99980264 , (LIOReal)0.99982591 , (LIOReal)0.99984644 , (LIOReal)0.99986455 , (LIOReal)0.99988052 , (LIOReal)0.99989461 , (LIOReal)0.99990704 , (LIOReal)0.99991801 , (LIOReal)0.99992767 , (LIOReal)0.99993620 , (LIOReal)0.99994373 , (LIOReal)0.99995036 , (LIOReal)0.99995622 , (LIOReal)0.99996138 , (LIOReal)0.99996594 , (LIOReal)0.99996995 , (LIOReal)0.99997350 , (LIOReal)0.99997662 , (LIOReal)0.99997938 , (LIOReal)0.99998181 , (LIOReal)0.99998396 , (LIOReal)0.99998585 , (LIOReal)0.99998752 , (LIOReal)0.99998899 , (LIOReal)0.99999029 , (LIOReal)0.99999143 , (LIOReal)0.99999244 , (LIOReal)0.99999333 , (LIOReal)0.99999412 , (LIOReal)0.99999481 , (LIOReal)0.99999543 , (LIOReal)0.99999597 , (LIOReal)0.99999644 , (LIOReal)0.99999686 , (LIOReal)0.99999723 , (LIOReal)0.99999756 , (LIOReal)0.99999785 , (LIOReal)0.99999810 , (LIOReal)0.99999832 , (LIOReal)0.99999852 , (LIOReal)0.99999870 , (LIOReal)0.99999885 , (LIOReal)0.99999899 , (LIOReal)0.99999911 , (LIOReal)0.99999921 , (LIOReal)0.99999930 , (LIOReal)0.99999939 , (LIOReal)0.99999946 , (LIOReal)0.99999952 , (LIOReal)0.99999958 , (LIOReal)0.99999963 , (LIOReal)0.99999967 , (LIOReal)0.99999971 , (LIOReal)0.99999974 , (LIOReal)0.99999977 };


const int Mathlib::_randArraySize = 997; // 97 or 997? check below.
// look-up table contains 97 or 997 (see below) elements in ]0,1[
// 97 and 997 are a prime number -- not very useful, but may be useful to overcome modulo-based repetition btw rand call return value and call location.
const LIOReal Mathlib::_randArray[Mathlib::_randArraySize] = { (LIOReal)0.33751254 , (LIOReal)0.10982949 , (LIOReal)0.67151454 , (LIOReal)0.12688064 , (LIOReal)0.58726179 , (LIOReal)0.15095286 , (LIOReal)0.07472417 , (LIOReal)0.28936810 , (LIOReal)0.24423270 , (LIOReal)0.06469408 , (LIOReal)0.56820461 , (LIOReal)0.54914744 , (LIOReal)0.60732197 , (LIOReal)0.44182548 , (LIOReal)0.88415246 , (LIOReal)0.49598796 , (LIOReal)0.18505517 , (LIOReal)0.27131394 , (LIOReal)0.40972919 , (LIOReal)0.53610832 , (LIOReal)0.73871615 , (LIOReal)0.64944835 , (LIOReal)0.35757272 , (LIOReal)0.74072217 , (LIOReal)0.71464393 , (LIOReal)0.03159478 , (LIOReal)0.36158475 , (LIOReal)0.80892678 , (LIOReal)0.93630893 , (LIOReal)0.31444333 , (LIOReal)0.01354062 , (LIOReal)0.86509529 , (LIOReal)0.86308927 , (LIOReal)0.97542628 , (LIOReal)0.25125376 , (LIOReal)0.04563691 , (LIOReal)0.98645938 , (LIOReal)0.03861585 , (LIOReal)0.51003009 , (LIOReal)0.02256770 , (LIOReal)0.08876630 , (LIOReal)0.32748245 , (LIOReal)0.76880642 , (LIOReal)0.39869609 , (LIOReal)0.55115346 , (LIOReal)0.17502508 , (LIOReal)0.51203611 , (LIOReal)0.92427282 , (LIOReal)0.89117352 , (LIOReal)0.80692076 , (LIOReal)0.29739218 , (LIOReal)0.66850552 , (LIOReal)0.25827482 , (LIOReal)0.00351053 , (LIOReal)0.18004012 , (LIOReal)0.82397192 , (LIOReal)0.38365095 , (LIOReal)0.73269809 , (LIOReal)0.93329990 , (LIOReal)0.26028084 , (LIOReal)0.52106319 , (LIOReal)0.68756269 , (LIOReal)0.06569709 , (LIOReal)0.56318957 , (LIOReal)0.02056169 , (LIOReal)0.54413240 , (LIOReal)0.56720160 , (LIOReal)0.70962889 , (LIOReal)0.01253761 , (LIOReal)0.48796389 , (LIOReal)0.14393180 , (LIOReal)0.24523571 , (LIOReal)0.09277834 , (LIOReal)0.41273821 , (LIOReal)0.16700100 , (LIOReal)0.53009027 , (LIOReal)0.34653962 , (LIOReal)0.08174524 , (LIOReal)0.20611836 , (LIOReal)0.60531595 , (LIOReal)0.38565697 , (LIOReal)0.93129388 , (LIOReal)0.25325978 , (LIOReal)0.18706118 , (LIOReal)0.98846540 , (LIOReal)0.20210632 , (LIOReal)0.48395186 , (LIOReal)0.69157472 , (LIOReal)0.44884654 , (LIOReal)0.04262788 , (LIOReal)0.00551655 , (LIOReal)0.52507523 , (LIOReal)0.70862588 , (LIOReal)0.57321966 , (LIOReal)0.43179539 , (LIOReal)0.08976931 , (LIOReal)0.56218656 , (LIOReal)0.19307924 , (LIOReal)0.55015045 , (LIOReal)0.45386158 , (LIOReal)0.64142427 , (LIOReal)0.50300903 , (LIOReal)0.79087262 , (LIOReal)0.43881645 , (LIOReal)0.45085256 , (LIOReal)0.29839519 , (LIOReal)0.81293882 , (LIOReal)0.35055165 , (LIOReal)0.82196590 , (LIOReal)0.59327984 , (LIOReal)0.52407222 , (LIOReal)0.25626881 , (LIOReal)0.37562688 , (LIOReal)0.03360080 , (LIOReal)0.72166499 , (LIOReal)0.42076229 , (LIOReal)0.53410231 , (LIOReal)0.67452357 , (LIOReal)0.30742227 , (LIOReal)0.21213641 , (LIOReal)0.00952859 , (LIOReal)0.90120361 , (LIOReal)0.97743230 , (LIOReal)0.50401204 , (LIOReal)0.09478435 , (LIOReal)0.14092277 , (LIOReal)0.65245737 , (LIOReal)0.01554664 , (LIOReal)0.92627884 , (LIOReal)0.62437312 , (LIOReal)0.16198596 , (LIOReal)0.86208626 , (LIOReal)0.52306921 , (LIOReal)0.33350050 , (LIOReal)0.83901705 , (LIOReal)0.23921765 , (LIOReal)0.94032096 , (LIOReal)0.33049147 , (LIOReal)0.85506520 , (LIOReal)0.38966901 , (LIOReal)0.50000000 , (LIOReal)0.52708124 , (LIOReal)0.46389168 , (LIOReal)0.88014042 , (LIOReal)0.09378134 , (LIOReal)0.23821464 , (LIOReal)0.92026078 , (LIOReal)0.03059178 , (LIOReal)0.53510532 , (LIOReal)0.51905717 , (LIOReal)0.77983952 , (LIOReal)0.53811434 , (LIOReal)0.85406219 , (LIOReal)0.16499498 , (LIOReal)0.68254764 , (LIOReal)0.18806419 , (LIOReal)0.43681043 , (LIOReal)0.61735206 , (LIOReal)0.58224674 , (LIOReal)0.45285858 , (LIOReal)0.22818455 , (LIOReal)0.73570712 , (LIOReal)0.49799398 , (LIOReal)0.48194584 , (LIOReal)0.64744233 , (LIOReal)0.32447342 , (LIOReal)0.17703109 , (LIOReal)0.23520562 , (LIOReal)0.87111334 , (LIOReal)0.44684052 , (LIOReal)0.02557673 , (LIOReal)0.02858576 , (LIOReal)0.97442327 , (LIOReal)0.13490471 , (LIOReal)0.42978937 , (LIOReal)0.03660983 , (LIOReal)0.39267803 , (LIOReal)0.87713139 , (LIOReal)0.23119358 , (LIOReal)0.65747242 , (LIOReal)0.95336008 , (LIOReal)0.90722166 , (LIOReal)0.57823470 , (LIOReal)0.52908726 , (LIOReal)0.36559679 , (LIOReal)0.28535607 , (LIOReal)0.87512538 , (LIOReal)0.19007021 , (LIOReal)0.41574724 , (LIOReal)0.32347041 , (LIOReal)0.36459378 , (LIOReal)0.37261785 , (LIOReal)0.78385155 , (LIOReal)0.86409228 , (LIOReal)0.10080241 , (LIOReal)0.78686058 , (LIOReal)0.62337011 , (LIOReal)0.66549649 , (LIOReal)0.35456369 , (LIOReal)0.11985958 , (LIOReal)0.84603811 , (LIOReal)0.21113340 , (LIOReal)0.00752257 , (LIOReal)0.66950853 , (LIOReal)0.74573721 , (LIOReal)0.40070211 , (LIOReal)0.00852558 , (LIOReal)0.22617854 , (LIOReal)0.10682046 , (LIOReal)0.78184554 , (LIOReal)0.84002006 , (LIOReal)0.77181545 , (LIOReal)0.77081244 , (LIOReal)0.72066199 , (LIOReal)0.33249749 , (LIOReal)0.57522568 , (LIOReal)0.69558676 , (LIOReal)0.40270812 , (LIOReal)0.90621866 , (LIOReal)0.71664995 , (LIOReal)0.72367101 , (LIOReal)0.03460381 , (LIOReal)0.08375125 , (LIOReal)0.02457372 , (LIOReal)0.07071214 , (LIOReal)0.43781344 , (LIOReal)0.06068205 , (LIOReal)0.74172518 , (LIOReal)0.05967904 , (LIOReal)0.42176530 , (LIOReal)0.76680040 , (LIOReal)0.63540622 , (LIOReal)0.43380140 , (LIOReal)0.23019057 , (LIOReal)0.82698094 , (LIOReal)0.88816449 , (LIOReal)0.87311936 , (LIOReal)0.17402207 , (LIOReal)0.09979940 , (LIOReal)0.20812437 , (LIOReal)0.96439318 , (LIOReal)0.89017051 , (LIOReal)0.96940822 , (LIOReal)0.94633902 , (LIOReal)0.27733200 , (LIOReal)0.30341023 , (LIOReal)0.61233701 , (LIOReal)0.67552658 , (LIOReal)0.02657974 , (LIOReal)0.46790371 , (LIOReal)0.95636911 , (LIOReal)0.31043129 , (LIOReal)0.15697091 , (LIOReal)0.91725176 , (LIOReal)0.85005015 , (LIOReal)0.57622869 , (LIOReal)0.39669007 , (LIOReal)0.38465396 , (LIOReal)0.90020060 , (LIOReal)0.82296891 , (LIOReal)0.71765296 , (LIOReal)0.75075226 , (LIOReal)0.96840522 , (LIOReal)0.37763290 , (LIOReal)0.04363089 , (LIOReal)0.41374122 , (LIOReal)0.31143430 , (LIOReal)0.23219659 , (LIOReal)0.00651956 , (LIOReal)0.11685055 , (LIOReal)0.47392177 , (LIOReal)0.40672016 , (LIOReal)0.37061184 , (LIOReal)0.43580742 , (LIOReal)0.80491474 , (LIOReal)0.10782347 , (LIOReal)0.47592778 , (LIOReal)0.35857573 , (LIOReal)0.41675025 , (LIOReal)0.13590772 , (LIOReal)0.36258776 , (LIOReal)0.01955868 , (LIOReal)0.78485456 , (LIOReal)0.30641926 , (LIOReal)0.41875627 , (LIOReal)0.31745236 , (LIOReal)0.16298897 , (LIOReal)0.14894684 , (LIOReal)0.50702106 , (LIOReal)0.00250752 , (LIOReal)0.90220662 , (LIOReal)0.28134403 , (LIOReal)0.03259779 , (LIOReal)0.80391174 , (LIOReal)0.49498495 , (LIOReal)0.37161484 , (LIOReal)0.56920762 , (LIOReal)0.81995988 , (LIOReal)0.10280843 , (LIOReal)0.19408225 , (LIOReal)0.44282849 , (LIOReal)0.33650953 , (LIOReal)0.06970913 , (LIOReal)0.48696088 , (LIOReal)0.99448345 , (LIOReal)0.58024072 , (LIOReal)0.36960883 , (LIOReal)0.35155466 , (LIOReal)0.31344032 , (LIOReal)0.75677031 , (LIOReal)0.42778335 , (LIOReal)0.72968907 , (LIOReal)0.36058175 , (LIOReal)0.00451354 , (LIOReal)0.42878636 , (LIOReal)0.95536610 , (LIOReal)0.49899699 , (LIOReal)0.54714142 , (LIOReal)0.97041123 , (LIOReal)0.64343029 , (LIOReal)0.14593781 , (LIOReal)0.25225677 , (LIOReal)0.34553661 , (LIOReal)0.57923771 , (LIOReal)0.70260782 , (LIOReal)0.81795386 , (LIOReal)0.57723170 , (LIOReal)0.79789368 , (LIOReal)0.15897693 , (LIOReal)0.65646941 , (LIOReal)0.89418255 , (LIOReal)0.25927783 , (LIOReal)0.47893681 , (LIOReal)0.28836510 , (LIOReal)0.07673019 , (LIOReal)0.60230692 , (LIOReal)0.85807422 , (LIOReal)0.05867603 , (LIOReal)0.79488465 , (LIOReal)0.04162487 , (LIOReal)0.48094283 , (LIOReal)0.46288867 , (LIOReal)0.92828485 , (LIOReal)0.74272818 , (LIOReal)0.61133400 , (LIOReal)0.97141424 , (LIOReal)0.95135406 , (LIOReal)0.19207623 , (LIOReal)0.55817452 , (LIOReal)0.63941825 , (LIOReal)0.10882648 , (LIOReal)0.68555667 , (LIOReal)0.11484453 , (LIOReal)0.13289870 , (LIOReal)0.05366098 , (LIOReal)0.12086259 , (LIOReal)0.54814443 , (LIOReal)0.91323972 , (LIOReal)0.35356068 , (LIOReal)0.84202608 , (LIOReal)0.76078235 , (LIOReal)0.71063190 , (LIOReal)0.24122367 , (LIOReal)0.21013039 , (LIOReal)0.91223671 , (LIOReal)0.94934804 , (LIOReal)0.60330993 , (LIOReal)0.06168506 , (LIOReal)0.09177533 , (LIOReal)0.93430291 , (LIOReal)0.08274824 , (LIOReal)0.16098295 , (LIOReal)0.50902708 , (LIOReal)0.25025075 , (LIOReal)0.39167503 , (LIOReal)0.65446339 , (LIOReal)0.61033099 , (LIOReal)0.58124373 , (LIOReal)0.14794383 , (LIOReal)0.84302909 , (LIOReal)0.75175527 , (LIOReal)0.50601805 , (LIOReal)0.72467402 , (LIOReal)0.26629890 , (LIOReal)0.44483450 , (LIOReal)0.14292879 , (LIOReal)0.07171515 , (LIOReal)0.61334002 , (LIOReal)0.04964895 , (LIOReal)0.60431294 , (LIOReal)0.55717151 , (LIOReal)0.04463390 , (LIOReal)0.30942828 , (LIOReal)0.65546640 , (LIOReal)0.89618857 , (LIOReal)0.22718154 , (LIOReal)0.75275827 , (LIOReal)0.29438315 , (LIOReal)0.28335005 , (LIOReal)0.32948847 , (LIOReal)0.14192578 , (LIOReal)0.18906720 , (LIOReal)0.40772317 , (LIOReal)0.54112337 , (LIOReal)0.10180542 , (LIOReal)0.30140421 , (LIOReal)0.57121364 , (LIOReal)0.45787362 , (LIOReal)0.51705115 , (LIOReal)0.34453360 , (LIOReal)0.16800401 , (LIOReal)0.47993982 , (LIOReal)0.58826479 , (LIOReal)0.93029087 , (LIOReal)0.77783350 , (LIOReal)0.50200602 , (LIOReal)0.66148445 , (LIOReal)0.54312939 , (LIOReal)0.20511535 , (LIOReal)0.05566700 , (LIOReal)0.44984955 , (LIOReal)0.63039117 , (LIOReal)0.69759278 , (LIOReal)0.06268806 , (LIOReal)0.96639920 , (LIOReal)0.30040120 , (LIOReal)0.10581745 , (LIOReal)0.02156469 , (LIOReal)0.62938816 , (LIOReal)0.06369107 , (LIOReal)0.30240722 , (LIOReal)0.79989970 , (LIOReal)0.60130391 , (LIOReal)0.16399198 , (LIOReal)0.78084253 , (LIOReal)0.60932798 , (LIOReal)0.47793380 , (LIOReal)0.25426279 , (LIOReal)0.99648947 , (LIOReal)0.53911735 , (LIOReal)0.64443330 , (LIOReal)0.81394183 , (LIOReal)0.41775326 , (LIOReal)0.33550652 , (LIOReal)0.09679037 , (LIOReal)0.91023069 , (LIOReal)0.01053159 , (LIOReal)0.53309930 , (LIOReal)0.66248746 , (LIOReal)0.93530592 , (LIOReal)0.97642929 , (LIOReal)0.80190572 , (LIOReal)0.91524574 , (LIOReal)0.74473420 , (LIOReal)0.40371113 , (LIOReal)0.20010030 , (LIOReal)0.61935807 , (LIOReal)0.43981946 , (LIOReal)0.73370110 , (LIOReal)0.23420261 , (LIOReal)0.43279840 , (LIOReal)0.86910732 , (LIOReal)0.71965898 , (LIOReal)0.17101304 , (LIOReal)0.75476429 , (LIOReal)0.91624875 , (LIOReal)0.64242728 , (LIOReal)0.73671013 , (LIOReal)0.67753260 , (LIOReal)0.78284855 , (LIOReal)0.76278837 , (LIOReal)0.13089268 , (LIOReal)0.63239719 , (LIOReal)0.95937813 , (LIOReal)0.62838516 , (LIOReal)0.89518556 , (LIOReal)0.09578736 , (LIOReal)0.49297894 , (LIOReal)0.28635908 , (LIOReal)0.03560682 , (LIOReal)0.77582748 , (LIOReal)0.65847543 , (LIOReal)0.88214644 , (LIOReal)0.09077232 , (LIOReal)0.98144433 , (LIOReal)0.16599799 , (LIOReal)0.39067202 , (LIOReal)0.81895687 , (LIOReal)0.90521565 , (LIOReal)0.28034102 , (LIOReal)0.52808425 , (LIOReal)0.60030090 , (LIOReal)0.24222668 , (LIOReal)0.92928786 , (LIOReal)0.70561685 , (LIOReal)0.31544634 , (LIOReal)0.59929789 , (LIOReal)0.69257773 , (LIOReal)0.29638917 , (LIOReal)0.38665998 , (LIOReal)0.29137412 , (LIOReal)0.78986961 , (LIOReal)0.52006018 , (LIOReal)0.74774323 , (LIOReal)0.24924774 , (LIOReal)0.58324975 , (LIOReal)0.94132397 , (LIOReal)0.63841525 , (LIOReal)0.18104313 , (LIOReal)0.68856570 , (LIOReal)0.64543631 , (LIOReal)0.34052156 , (LIOReal)0.91925777 , (LIOReal)0.31945838 , (LIOReal)0.99147442 , (LIOReal)0.51805416 , (LIOReal)0.01454363 , (LIOReal)0.70762287 , (LIOReal)0.34954865 , (LIOReal)0.87612839 , (LIOReal)0.55315948 , (LIOReal)0.07572718 , (LIOReal)0.41975928 , (LIOReal)0.83801404 , (LIOReal)0.62036108 , (LIOReal)0.45586760 , (LIOReal)0.76579739 , (LIOReal)0.90822467 , (LIOReal)0.24623872 , (LIOReal)0.11183551 , (LIOReal)0.27632899 , (LIOReal)0.26228686 , (LIOReal)0.28736209 , (LIOReal)0.79689067 , (LIOReal)0.98345035 , (LIOReal)0.22116349 , (LIOReal)0.15596790 , (LIOReal)0.86810431 , (LIOReal)0.44784353 , (LIOReal)0.39568706 , (LIOReal)0.00150451 , (LIOReal)0.94433300 , (LIOReal)0.91825476 , (LIOReal)0.66750251 , (LIOReal)0.42276830 , (LIOReal)0.51103310 , (LIOReal)0.42377131 , (LIOReal)0.75877633 , (LIOReal)0.72266800 , (LIOReal)0.59729188 , (LIOReal)0.70661986 , (LIOReal)0.75576730 , (LIOReal)0.36760281 , (LIOReal)0.85205617 , (LIOReal)0.65145436 , (LIOReal)0.26730191 , (LIOReal)0.76780341 , (LIOReal)0.39769308 , (LIOReal)0.34754263 , (LIOReal)0.67853561 , (LIOReal)0.87211635 , (LIOReal)0.83199599 , (LIOReal)0.65346038 , (LIOReal)0.30441324 , (LIOReal)0.81193581 , (LIOReal)0.44583751 , (LIOReal)0.34152457 , (LIOReal)0.96539619 , (LIOReal)0.21614845 , (LIOReal)0.18605817 , (LIOReal)0.57422267 , (LIOReal)0.79588766 , (LIOReal)0.89317954 , (LIOReal)0.63440321 , (LIOReal)0.97943831 , (LIOReal)0.50802407 , (LIOReal)0.47091274 , (LIOReal)0.94232698 , (LIOReal)0.60832497 , (LIOReal)0.61835507 , (LIOReal)0.71263791 , (LIOReal)0.26930792 , (LIOReal)0.49398195 , (LIOReal)0.17903711 , (LIOReal)0.57221665 , (LIOReal)0.64042126 , (LIOReal)0.23319960 , (LIOReal)0.17001003 , (LIOReal)0.09779338 , (LIOReal)0.67251755 , (LIOReal)0.51303912 , (LIOReal)0.22517553 , (LIOReal)0.55215647 , (LIOReal)0.50100301 , (LIOReal)0.83600802 , (LIOReal)0.49197593 , (LIOReal)0.18405216 , (LIOReal)0.70461384 , (LIOReal)0.13891675 , (LIOReal)0.65045135 , (LIOReal)0.12186560 , (LIOReal)0.55917753 , (LIOReal)0.50501505 , (LIOReal)0.62136409 , (LIOReal)0.14493480 , (LIOReal)0.85305918 , (LIOReal)0.14994985 , (LIOReal)0.83701103 , (LIOReal)0.29939819 , (LIOReal)0.20310933 , (LIOReal)0.37863591 , (LIOReal)0.91424273 , (LIOReal)0.35255767 , (LIOReal)0.13691073 , (LIOReal)0.72768305 , (LIOReal)0.48495486 , (LIOReal)0.66649950 , (LIOReal)0.30541625 , (LIOReal)0.12587763 , (LIOReal)0.69358074 , (LIOReal)0.78886660 , (LIOReal)0.73971916 , (LIOReal)0.85105316 , (LIOReal)0.76980943 , (LIOReal)0.77482447 , (LIOReal)0.99949850 , (LIOReal)0.06870612 , (LIOReal)0.45987964 , (LIOReal)0.13991976 , (LIOReal)0.05667001 , (LIOReal)0.46690070 , (LIOReal)0.38264794 , (LIOReal)0.62537613 , (LIOReal)0.61534604 , (LIOReal)0.19809428 , (LIOReal)0.67953862 , (LIOReal)0.20712136 , (LIOReal)0.21514544 , (LIOReal)0.58525577 , (LIOReal)0.12988967 , (LIOReal)0.98044132 , (LIOReal)0.31845537 , (LIOReal)0.96238716 , (LIOReal)0.53209629 , (LIOReal)0.67051153 , (LIOReal)0.48896690 , (LIOReal)0.26128385 , (LIOReal)0.98244734 , (LIOReal)0.23620863 , (LIOReal)0.13189569 , (LIOReal)0.82096289 , (LIOReal)0.89919759 , (LIOReal)0.80992979 , (LIOReal)0.46088265 , (LIOReal)0.42477432 , (LIOReal)0.52607823 , (LIOReal)0.90421264 , (LIOReal)0.63139418 , (LIOReal)0.51404213 , (LIOReal)0.22316951 , (LIOReal)0.33450351 , (LIOReal)0.58625878 , (LIOReal)0.93731194 , (LIOReal)0.58926780 , (LIOReal)0.19608826 , (LIOReal)0.97241725 , (LIOReal)0.40571715 , (LIOReal)0.59829488 , (LIOReal)0.72567703 , (LIOReal)0.82497492 , (LIOReal)0.27833501 , (LIOReal)0.24022066 , (LIOReal)0.15396189 , (LIOReal)0.97843531 , (LIOReal)0.82597793 , (LIOReal)0.68956871 , (LIOReal)0.07271815 , (LIOReal)0.94533601 , (LIOReal)0.22216650 , (LIOReal)0.46489468 , (LIOReal)0.20110331 , (LIOReal)0.68054162 , (LIOReal)0.34252758 , (LIOReal)0.40170512 , (LIOReal)0.47492477 , (LIOReal)0.81093280 , (LIOReal)0.27331996 , (LIOReal)0.17602808 , (LIOReal)0.59428285 , (LIOReal)0.95837513 , (LIOReal)0.95235707 , (LIOReal)0.63640923 , (LIOReal)0.05165496 , (LIOReal)0.69959880 , (LIOReal)0.43079238 , (LIOReal)0.15997994 , (LIOReal)0.32647944 , (LIOReal)0.80792377 , (LIOReal)0.83099298 , (LIOReal)0.20912738 , (LIOReal)0.85707121 , (LIOReal)0.73169509 , (LIOReal)0.01855567 , (LIOReal)0.77683049 , (LIOReal)0.32246740 , (LIOReal)0.86008024 , (LIOReal)0.93831494 , (LIOReal)0.14694082 , (LIOReal)0.25727182 , (LIOReal)0.39468405 , (LIOReal)0.69658977 , (LIOReal)0.83400201 , (LIOReal)0.56419258 , (LIOReal)0.69057172 , (LIOReal)0.99749248 , (LIOReal)0.21915747 , (LIOReal)0.72668004 , (LIOReal)0.66349047 , (LIOReal)0.98445336 , (LIOReal)0.83500502 , (LIOReal)0.75376128 , (LIOReal)0.26830491 , (LIOReal)0.77883651 , (LIOReal)0.99849549 , (LIOReal)0.96339017 , (LIOReal)0.80591775 , (LIOReal)0.01654965 , (LIOReal)0.85606820 , (LIOReal)0.15496489 , (LIOReal)0.23721163 , (LIOReal)0.44383149 , (LIOReal)0.71163490 , (LIOReal)0.93229689 , (LIOReal)0.46890672 , (LIOReal)0.53109328 , (LIOReal)0.59227683 , (LIOReal)0.02958877 , (LIOReal)0.98746239 , (LIOReal)0.48595787 , (LIOReal)0.07973922 , (LIOReal)0.69458375 , (LIOReal)0.38766299 , (LIOReal)0.62236710 , (LIOReal)0.15195587 , (LIOReal)0.84704112 , (LIOReal)0.71865597 , (LIOReal)0.82798395 , (LIOReal)0.18204614 , (LIOReal)0.76479438 , (LIOReal)0.79388164 , (LIOReal)0.15295888 , (LIOReal)0.28234704 , (LIOReal)0.84102307 , (LIOReal)0.77382146 , (LIOReal)0.34353059 , (LIOReal)0.40872618 , (LIOReal)0.06670010 , (LIOReal)0.88314945 , (LIOReal)0.10481444 , (LIOReal)0.27031093 , (LIOReal)0.59628887 , (LIOReal)0.48996991 , (LIOReal)0.49097292 , (LIOReal)0.29338014 , (LIOReal)0.90320963 , (LIOReal)0.17301906 , (LIOReal)0.70160481 , (LIOReal)0.64844534 , (LIOReal)0.39969910 , (LIOReal)0.81594784 , (LIOReal)0.42678034 , (LIOReal)0.20411234 , (LIOReal)0.15797392 , (LIOReal)0.11785356 , (LIOReal)0.33951856 , (LIOReal)0.33149448 , (LIOReal)0.87412237 , (LIOReal)0.46188566 , (LIOReal)0.87813440 , (LIOReal)0.08676028 , (LIOReal)0.54012036 , (LIOReal)0.38164493 , (LIOReal)0.29237713 , (LIOReal)0.40471414 , (LIOReal)0.07773320 , (LIOReal)0.19709127 , (LIOReal)0.83299900 , (LIOReal)0.96740221 , (LIOReal)0.35556670 , (LIOReal)0.27231695 , (LIOReal)0.81695085 , (LIOReal)0.55516550 , (LIOReal)0.11584754 , (LIOReal)0.28435306 , (LIOReal)0.24724173 , (LIOReal)0.32848546 , (LIOReal)0.13390171 , (LIOReal)0.57021063 , (LIOReal)0.77281846 , (LIOReal)0.02758275 , (LIOReal)0.92126379 , (LIOReal)0.88716148 , (LIOReal)0.37963892 , (LIOReal)0.84403210 , (LIOReal)0.49699097 , (LIOReal)0.80090271 , (LIOReal)0.60631896 , (LIOReal)0.70361083 , (LIOReal)0.68455366 , (LIOReal)0.93931795 , (LIOReal)0.68355065 , (LIOReal)0.11885657 , (LIOReal)0.84503511 , (LIOReal)0.08776329 , (LIOReal)0.05466399 , (LIOReal)0.04764293 , (LIOReal)0.56619860 , (LIOReal)0.19508526 , (LIOReal)0.67352056 , (LIOReal)0.96038114 , (LIOReal)0.95436309 , (LIOReal)0.24824473 , (LIOReal)0.03761284 , (LIOReal)0.99247743 , (LIOReal)0.11083250 , (LIOReal)0.53711133 , (LIOReal)0.74674022 , (LIOReal)0.25526580 , (LIOReal)0.41173521 , (LIOReal)0.64643932 , (LIOReal)0.62738215 , (LIOReal)0.45687061 , (LIOReal)0.08575727 , (LIOReal)0.21715145 , (LIOReal)0.88615848 , (LIOReal)0.45486459 , (LIOReal)0.16900702 , (LIOReal)0.73069208 , (LIOReal)0.84804413 , (LIOReal)0.71564694 , (LIOReal)0.19909729 , (LIOReal)0.55616851 , (LIOReal)0.70060181 , (LIOReal)0.69859579 , (LIOReal)0.85907723 , (LIOReal)0.00050150 , (LIOReal)0.73470411 , (LIOReal)0.01153460 , (LIOReal)0.99047141 , (LIOReal)0.74874624 , (LIOReal)0.94834504 , (LIOReal)0.02357071 , (LIOReal)0.11384152 , (LIOReal)0.66048144 , (LIOReal)0.98545637 , (LIOReal)0.94332999 , (LIOReal)0.63340020 , (LIOReal)0.99348044 , (LIOReal)0.63741224 , (LIOReal)0.88114343 , (LIOReal)0.44082247 , (LIOReal)0.24322969 , (LIOReal)0.61634905 , (LIOReal)0.04663992 , (LIOReal)0.05767302 , (LIOReal)0.47693079 , (LIOReal)0.09879639 , (LIOReal)0.54613842 , (LIOReal)0.36659980 , (LIOReal)0.29538616 , (LIOReal)0.45185557 , (LIOReal)0.06770311 , (LIOReal)0.91123370 , (LIOReal)0.79187563 , (LIOReal)0.89217653 , (LIOReal)0.79287864 , (LIOReal)0.45887663 , (LIOReal)0.94734203 , (LIOReal)0.86108325 , (LIOReal)0.26529589 , (LIOReal)0.74373119 , (LIOReal)0.18304915 , (LIOReal)0.12888666 , (LIOReal)0.99548646 , (LIOReal)0.37462387 , (LIOReal)0.04062187 , (LIOReal)0.75977934 , (LIOReal)0.26328987 , (LIOReal)0.22417252 , (LIOReal)0.21414243 , (LIOReal)0.95737212 , (LIOReal)0.07372116 , (LIOReal)0.59127382 , (LIOReal)0.05065196 , (LIOReal)0.92527583 , (LIOReal)0.86609829 , (LIOReal)0.92326981 , (LIOReal)0.32547643 , (LIOReal)0.82998997 , (LIOReal)0.68655968 , (LIOReal)0.32146439 , (LIOReal)0.55416249 , (LIOReal)0.56018054 , (LIOReal)0.03961886 , (LIOReal)0.07873621 , (LIOReal)0.90922768 , (LIOReal)0.86710130 , (LIOReal)0.41474423 , (LIOReal)0.51604814 , (LIOReal)0.68154463 , (LIOReal)0.46589769 , (LIOReal)0.78585757 , (LIOReal)0.11283852 , (LIOReal)0.22016048 , (LIOReal)0.12387161 , (LIOReal)0.12487462 , (LIOReal)0.73771314 , (LIOReal)0.26429288 , (LIOReal)0.21313942 , (LIOReal)0.37362086 , (LIOReal)0.61434303 , (LIOReal)0.05265797 , (LIOReal)0.54212638 , (LIOReal)0.76178536 , (LIOReal)0.51504514 , (LIOReal)0.96138415 , (LIOReal)0.92728185 , (LIOReal)0.38064193 , (LIOReal)0.72868606 , (LIOReal)0.12286861 , (LIOReal)0.36860582 , (LIOReal)0.31243731 , (LIOReal)0.58425276 , (LIOReal)0.35957874 , (LIOReal)0.67652959 , (LIOReal)0.39368104 , (LIOReal)0.92226680 , (LIOReal)0.65947844 , (LIOReal)0.59027081 , (LIOReal)0.56118355 , (LIOReal)0.54513541 , (LIOReal)0.21815446 , (LIOReal)0.10381143 , (LIOReal)0.42577733 , (LIOReal)0.38866600 , (LIOReal)0.27432297 , (LIOReal)0.89719157 , (LIOReal)0.71364092 , (LIOReal)0.97342026 , (LIOReal)0.04864594 , (LIOReal)0.59528586 , (LIOReal)0.13791374 , (LIOReal)0.33851555 , (LIOReal)0.46990973 , (LIOReal)0.87011033 , (LIOReal)0.79889669 , (LIOReal)0.27532598 , (LIOReal)0.12788365 , (LIOReal)0.32046138 , (LIOReal)0.87913741 , (LIOReal)0.78786359 , (LIOReal)0.29037111 , (LIOReal)0.74974925 , (LIOReal)0.36359077 , (LIOReal)0.47291876 , (LIOReal)0.19107322 , (LIOReal)0.84904714 , (LIOReal)0.88916750 , (LIOReal)0.52206620 , (LIOReal)0.75777332 , (LIOReal)0.17201605 , (LIOReal)0.48294885 , (LIOReal)0.89819458 , (LIOReal)0.95035105 , (LIOReal)0.35656971 , (LIOReal)0.62637914 , (LIOReal)0.17803410 , (LIOReal)0.37662989 , (LIOReal)0.27933801 , (LIOReal)0.31644935 , (LIOReal)0.66449348 , (LIOReal)0.43480441 , (LIOReal)0.22918756 , (LIOReal)0.30842528 , (LIOReal)0.76379137 , (LIOReal)0.88515547 , (LIOReal)0.08475426 , (LIOReal)0.47191575 , (LIOReal)0.08074223 , (LIOReal)0.82898696 , (LIOReal)0.34854564 , (LIOReal)0.56519559 , (LIOReal)0.41073220 , (LIOReal)0.98946841 , (LIOReal)0.80290873 , (LIOReal)0.01755266 , (LIOReal)0.81494483} ;
//const LIOReal Mathlib::_randArray[97] = { (LIOReal)0.52061856 , (LIOReal)0.97422680 , (LIOReal)0.68556701 , (LIOReal)0.33505155 , (LIOReal)0.87113402 , (LIOReal)0.70618557 , (LIOReal)0.31443299 , (LIOReal)0.90206186 , (LIOReal)0.24226804 , (LIOReal)0.26288660 , (LIOReal)0.89175258 , (LIOReal)0.15979381 , (LIOReal)0.67525773 , (LIOReal)0.19072165 , (LIOReal)0.62371134 , (LIOReal)0.53092784 , (LIOReal)0.92268041 , (LIOReal)0.20103093 , (LIOReal)0.12886598 , (LIOReal)0.74742268 , (LIOReal)0.77835052 , (LIOReal)0.56185567 , (LIOReal)0.64432990 , (LIOReal)0.37628866 , (LIOReal)0.46907216 , (LIOReal)0.72680412 , (LIOReal)0.71649485 , (LIOReal)0.03608247 , (LIOReal)0.39690722 , (LIOReal)0.22164948 , (LIOReal)0.94329897 , (LIOReal)0.48969072 , (LIOReal)0.80927835 , (LIOReal)0.04639175 , (LIOReal)0.75773196 , (LIOReal)0.09793814 , (LIOReal)0.55154639 , (LIOReal)0.79896907 , (LIOReal)0.54123711 , (LIOReal)0.98453608 , (LIOReal)0.13917526 , (LIOReal)0.65463918 , (LIOReal)0.84020619 , (LIOReal)0.35567010 , (LIOReal)0.50000000 , (LIOReal)0.30412371 , (LIOReal)0.78865979 , (LIOReal)0.00515464 , (LIOReal)0.21134021 , (LIOReal)0.44845361 , (LIOReal)0.02577320 , (LIOReal)0.73711340 , (LIOReal)0.14948454 , (LIOReal)0.88144330 , (LIOReal)0.41752577 , (LIOReal)0.51030928 , (LIOReal)0.63402062 , (LIOReal)0.27319588 , (LIOReal)0.81958763 , (LIOReal)0.10824742 , (LIOReal)0.85051546 , (LIOReal)0.11855670 , (LIOReal)0.60309278 , (LIOReal)0.91237113 , (LIOReal)0.43814433 , (LIOReal)0.34536082 , (LIOReal)0.57216495 , (LIOReal)0.69587629 , (LIOReal)0.61340206 , (LIOReal)0.36597938 , (LIOReal)0.40721649 , (LIOReal)0.18041237 , (LIOReal)0.23195876 , (LIOReal)0.86082474 , (LIOReal)0.66494845 , (LIOReal)0.08762887 , (LIOReal)0.76804124 , (LIOReal)0.29381443 , (LIOReal)0.58247423 , (LIOReal)0.82989691 , (LIOReal)0.59278351 , (LIOReal)0.05670103 , (LIOReal)0.06701031 , (LIOReal)0.32474227 , (LIOReal)0.42783505 , (LIOReal)0.93298969 , (LIOReal)0.25257732 , (LIOReal)0.45876289 , (LIOReal)0.38659794 , (LIOReal)0.96391753 , (LIOReal)0.99484536 , (LIOReal)0.07731959 , (LIOReal)0.17010309 , (LIOReal)0.95360825 , (LIOReal)0.47938144 , (LIOReal)0.28350515 , (LIOReal)0.01546392};

// random generator
int Mathlib::_randSeed = 0; // default...
int Mathlib::_randIt = 0; // default...

Mathlib::base_generator_type Mathlib::_generator;

// gaussian random generator
int Mathlib::_gaussianRandTick = 0; 			// These two values are used to accelerate
LIOReal Mathlib::_bufferedGaussianRandValue = 0;		// gaussian random generation (see method for more explanation)

LIOReal Mathlib::getTanh( LIOReal __value )
{
#ifdef EMBEDDED

	if ( __value < (LIOReal)-8 )
		return -1.;
	else
		if ( __value > (LIOReal)8)
			return 1.;
		else
		{
			LIOReal index = __value + (LIOReal)8;
			index.setRawValue( (int)(index.getRawValue() << 4) ); // for array size = 256 ONLY
			int indexInt = (int)index;

			//std::cout << "Ftanh(" << __value << ") = " << _tanhArray[indexInt] << " - (index=" << indexInt << ")" << std::endl;

			return _tanhArray[indexInt];
		}

#else // NOT EMBEDDED

	return tanh(__value);

#endif // EMBEDDED
}


void Mathlib::setRandSeed( int __seed )
{
	//_randSeed = __seed;
	_generator.seed(__seed);
}

LIOReal Mathlib::getRand( ) // returns a real number in ]0,1[
{
// 	return _randArray[ ( (_randIt++) + _randSeed ) % _randArraySize ];


	// Define a uniform random number distribution which produces "double"
	// values between 0 and 1 (0 inclusive, 1 exclusive).
	static 	boost::uniform_real<double> uni_dist(0,1);

	static boost::variate_generator<base_generator_type&, boost::uniform_real<double> > uni(_generator, uni_dist);
    return LIOReal(uni());
}


/*
 * credits:

	boxmuller.c           Implements the Polar form of the Box-Muller
                          Transformation

                      (c) Copyright 1994, Everett F. Carter Jr.
                          Permission is granted by the author to use
			  this software for any application provided this
			  copyright notice is preserved.
			  http://www.taygeta.com/random/gaussian.html
			  http://www.bearcave.com/misl/misl_tech/wavelets/hurst/random.html

	Nicolas says:
		- slight modification to comply with current setup...
		- Each call to the getGaussianRand generates *two* useful
			values, so one out of two calls, we simply return the
			buffered value.
		- should be replaced by a lookup table of gaussian curve + getRand() call
		- parameter: mean m, standard deviation s. if m=0 and s=1, then it is equivalent to the N(0,1) math notation.
*/
LIOReal Mathlib::getGaussianRand(LIOReal m, LIOReal s)
{
	LIOReal x1, x2, w, y1;

	if ( _gaussianRandTick )		        //use value from previous call
	{
		y1 = _bufferedGaussianRandValue;
		_gaussianRandTick = 0;
	} else {
		LIOReal one(1.0), two(2.0);
		do {
			x1 = two * getRand() - one;
			x2 = two * getRand() - one;
			w = x1 * x1 + x2 * x2;
		} while ( w >= one );

		float wTemp(w);
		w = sqrt( (-2.0 * log( wTemp ) ) / wTemp);   // [!n] THIS LINE IS CRAP!!! TODO: dedicated sqrt and log for Fixed32
		y1 = x1 * w;
		_bufferedGaussianRandValue = x2 * w;
		_gaussianRandTick = 1;
	}


	return LIOReal( m + y1 * s );
}


#ifdef UNITTEST
//
// Unit tests for Mathlib below
//

#include <test/TestHarness.h>
#include <string.h>

static const int nrTrials = 10000;

TEST( setRandSeed, Mathlib )
{
	Mathlib::setRandSeed(42);
}

TEST( getRand, Mathlib )
{
	LIOReal zero(0.0);
	LIOReal one(1.0);

	for (int i = 0; i < nrTrials; ++i)
	{
		CHECK(Mathlib::getRand() < one);
		CHECK(Mathlib::getRand() >= zero);
	}
}

TEST( getBool, Mathlib )
{
	for (int i = 0; i < nrTrials; ++i)
	{
		CHECK(Mathlib::getBool(1.1)); // must return true every time
		CHECK(!Mathlib::getBool(0.0)); // must return false every time
		Mathlib::getBool();	// TODO: maybe verify about 50% times true?
	}
}

TEST( getInt, Mathlib )
{
	for (int i = 0; i < nrTrials; ++i)
	{
		int limit = Mathlib::getInt(42);
		CHECK(Mathlib::getInt(limit) <= limit );
		CHECK(Mathlib::getInt(limit) >= 0 );


		size_t loc = (size_t) Mathlib::getInt(limit);
		CHECK(loc >= 0);
		CHECK(loc <= (size_t) limit);
	}
}

TEST( gaussian, Mathlib )
{
	for (int i = 0; i < nrTrials; ++i)
	{
		LIOReal sigma(Mathlib::getRand());
		LIOReal delta(Mathlib::getGaussianRand((LIOReal)0, sigma));
	}
	CHECK(true);
}
#endif //UNITTEST

//-n
